package com.example.singlelinkedlist;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        //创建节点

        //创建链表

        //加入到链表
        SingleLinkedList singleLinkedList=new SingleLinkedList();
        singleLinkedList.addByOrder(new HeroNode(1,"孙伟帅1","帅哥"));
        singleLinkedList.addByOrder(new HeroNode(2,"孙伟帅2","帅哥2"));
        singleLinkedList.addByOrder(new HeroNode(4,"孙伟帅4","帅哥4"));
        singleLinkedList.addByOrder(new HeroNode(3,"孙伟帅3","帅哥3"));
        singleLinkedList.addByOrder(new HeroNode(3,"孙伟帅3","帅哥3"));
        //显示一把
        singleLinkedList.list();
    }
}
//定义一个节点，每个HeroNode对象就是一个节点
class HeroNode{
    public int no;
    public String name;
    public String nickName;
    public HeroNode next;//指向下一个节点

    public HeroNode(int no, String name, String nickName) {
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                ", next=" + next +
                '}';
    }
}
//定义SingleLinkedList管理我们的英雄
class SingleLinkedList{
    //先初始化一个节点，头节点不要动，不存放具体数据
    private HeroNode head=new HeroNode(0,"","");
    /**
     * 添加节点到单向链表
     * 思路：当不考虑编号顺序时
     * 1.找到当前链表的最后一个节点
     * 2.将最后这个节点的next 指向新的节点
     */
    public void add(HeroNode heroNode){
        //因为head的节点不能动，因此我们需要一个辅助遍历temp
        HeroNode temp=head;
        //循环遍历，找到最后
        while (true) {
            //找到最后一个链表
            if (temp.next==null) {
                break;
            }
            //如果没有找到最后，将temp后移
            temp=temp.next;//为temp.next赋值
        }
        //当退出while循环时，temp就指向了链表的最后
        //见最后这个节点的next指向新的节点
        temp.next=heroNode;
    }

    /**
     * 第二种方式在添加英雄时，根据排名将英雄插入到指定位置
     * 如果有这个排名，则添加失败并给出提示
     */
    public void addByOrder(HeroNode heroNode){
        //因为头结点不能动，因此我们仍然通过一个辅助指针（变量）来帮助我们找到添加的位置
        //单链表，因为我们找的temp是位于添加位置的前一个节点，否则就插入不了
        HeroNode temp=head;
        boolean flag=false;//flag标志添加的编号是否存在，默认为false
        while (true) {
            if (temp.next==null) {//说明已经遍历到最后一个
                break;
            }
            if (temp.next.no>heroNode.no) {//位置找到，就在temp的后面插入
                break;
            }else  if (temp.next.no==heroNode.no){//说明希望添加的heroNode的编号已经存在
                flag=true;//说明编号存在
                break;
            }
            temp=temp.next;//后移，遍历当前的链表
        }
        //判断flag的值
        if (flag) {
            System.out.println("插入的已经存在");
        }else {
            //插入到链表中，temp的后面
            heroNode.next=temp.next;
            temp.next=heroNode;
        }
    }

    //显示链表【遍历】
    public void list(){
        //判断链表是否为空
        if (head.next==null) {
            //TODO：
            System.out.println("链表为空");
            return;
        }
        //TODO：因为头节点
        HeroNode temp=head.next;
        while (true) {
            //判断是否到链表最后
            if (temp==null) {
                break;
            }
            //输出节点信息
            System.out.println(temp.name);
            //将temp后移，一点记住，不然死循环
            temp=temp.next;
        }

    }
}